Django 在建立新專案以後,本身就有帳號驗證,只是有這些缺點:
django-authtools 最主要就是解決以上問題,在安裝 django-authtools 以後,你可以有:
使用 django-authtools 可以讓新專案省事很多。
專案網址:https://django-authtools.readthedocs.io/en/latest/
poetry add django-authtools
# settings
INSTALLED_APPS = [
# ...
'authtools',
]
AUTH_USER_MODEL = 'authtools.User'
把 authtools 加到 INSTALLED_APPS 以後,執行 migrate
poetry run python manage.py migrate
在 urls 加入 authtools.urls
# urls.py
urlpatterns = patterns('',
# ...
url(r'^accounts/', include('authtools.urls')),
# ...
)
django-authtools 提供 User 這個 model 可以直接使用,在 settings 裡指定 AUTH_USER_MODEL = "authtools.User" 就可以。
如果需要加新的欄位,可以使用 The User Profile pattern 的方式,新增 model 跟 User 作一對一關聯。當然,也可以自己繼承 django-authtools 提供的 AbstractEmailUser 跟 AbstractNamedUser 來添加新欄位。
from authtools.models import AbstractEmailUser
class User(AbstractEmailUser):
full_name = models.CharField('full name', max_length=255, blank=True)
preferred_name = models.CharField('preferred name',
max_length=255, blank=True)
def get_full_name(self):
return self.full_name
def get_short_name(self):
return self.preferred_name
在上面的例子裡,就繼承了 AbstractEmailUser,並添加了 full_name, preferred_name 這兩個欄位。
因為有定義新的 model,所以就有對應的 admin 介面。
使用的方法很簡單,在註冊 admin 時,指定對應的 Admin 類別就可以,例如:
# Define the admin class
from django.contrib.auth import get_user_model
from authtools.admin import NamedUserAdmin
User = get_user_model()
class MyUserAdmin(NamedUserAdmin):
pass
# Register the admin class with the associated model
admin.site.register(User, MyUserAdmin)
django-authtools 提供了登入、變更密碼、註冊等頁面,為此,也定義了可以重複使用的 Form :
django-authtools 提供了這些頁面:
這些頁面的邏輯已經完整,網址也定義在 authtools.urls 裡了。
那麼要怎麼去客製化頁面呢?方法很簡單,就是在專案目錄下建立 authtools/templates/registration 資料夾,然後把客製化過的 html 放進這個資料夾就可以了,html 的名稱如下:
Django 內建的帳號驗證,是會嚴格檢查字母大小寫的,如果你不需要檢查字母大小寫的話,可以在 settings 裡指定 AUTHENTICATION_BACKENDS 為 authtools.backends.CaseInsensitiveUsernameFieldModelBackend 。
# settings.py
AUTHENTICATION_BACKENDS = [
'authtools.backends.CaseInsensitiveUsernameFieldModelBackend',
]
回想起第一次弄 Django 專案的登入登出,因為還不熟,真的搞不清楚怎麼弄,參考了幾個專案才搞定。後來看到 django-edge ,用 django-edge 當作專案的樣板,裏面用到 django-authtools ,才知道有這麼方便的套件。